package legumes.client.ui.widgets.window;

import java.util.Arrays;

import legumes.client.resources.PNResources;
import legumes.client.services.callbacks.SaveStoreCallback;
import legumes.client.services.util.rpc.RPCCallSequencer;
import legumes.shared.domain.PaiementModeEnum;
import legumes.shared.domain.PaiementModes;
import legumes.shared.domain.Store;

import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.TextArea;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.WidgetCanvas;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.CloseClickHandler;
import com.smartgwt.client.widgets.events.CloseClientEvent;
import com.smartgwt.client.widgets.layout.VLayout;

public class StorePaiementModesEditionWindow extends Window {

	private Store store;

	public StorePaiementModesEditionWindow(Store store_) {
		super();
		store = store_;
		setTitle("<img src=\""
				+ PNResources.INSTANCE.paiementModeMonnaieIcon().getURL()
				+ "\" />&nbsp;Sélectionnés les modes de paiement proposés à vos clients");

		int windowHeight = com.google.gwt.user.client.Window.getClientHeight();
		if (windowHeight >= 580) {
			setHeight(580);
		} else {
			setHeight(480);
		}
		setWidth(640);
		setMembersMargin(10);
		setShowCloseButton(true);
		setShowMinimizeButton(false);
		setAutoCenter(true);
		setIsModal(true);
		setShowModalMask(true);
		addCloseClickHandler(new CloseClickHandler() {
			public void onCloseClick(CloseClientEvent event) {
				StorePaiementModesEditionWindow.this.destroy();
			}
		});

		addItem(buildPanel());
		show();
	}

	private VLayout buildPanel() {

		VLayout mainPanel = new VLayout();
		mainPanel.setWidth100();
		mainPanel.setHeight100();
		mainPanel.setMargin(10);

		Label lab = new Label(
				"<h3>Sélectionnez les moyens de paiements proposés à vos clients.</h3><BR/>"
		+ "Les clients vous paient directement lorsqu'ils récupèrent leurs marchandises."
		+ "Varier vos moyens de paiement permet de toucher et de fidéliser un plus grand nombre de personnes.<BR/>"
		+ "Pour chaque moyen de paiement, vous pouvez spécifier une condition à respecter, par exemple : <BR/> " 
		+ "<BR/><i><b>Master Card :</b> A partir de 20€ d'achat. <BR/> <b>Tickets Restaurants :</b> 2 titres restaurants par commandes. La monnaie n'est pas rendue sur les titres restaurants.</i>"		
		);
		lab.setAutoHeight();
		lab.setMargin(10);

		FlexTable ft = new FlexTable();
		
		int row = 0;
		ft.getFlexCellFormatter().setColSpan(0,0,3);
		ft.setText(row, 0, "Mode de paiement");
		ft.setText(row, 1, "Condition (facultatif)");
		row++;
		for(final PaiementModeEnum pme : PaiementModes.getPaiementModes(Arrays.asList(PaiementModeEnum.values()))){
			String conditionTxt = null;
			boolean hasPaiementMode = false;
			if( store.getPaiementModes().hasPaiementMode(pme) ){
				conditionTxt = store.getPaiementModes().getPaiementModeCondition(pme);
				hasPaiementMode = true;
			}
			
			if( conditionTxt ==null){
				conditionTxt = "";
			}
			
			final TextArea textAreaCondition = new TextArea();
			textAreaCondition.setWidth("300px");
			textAreaCondition.setHeight("20px");
			final CheckBox cb = new CheckBox();
			cb.setValue(hasPaiementMode);
			cb.addClickHandler(new ClickHandler() {
				
				@Override
				public void onClick(ClickEvent event) {
					if(cb.getValue()){
						store.getPaiementModes().addPaiementMode(pme, textAreaCondition.getText());
					} else {
						store.getPaiementModes().removePaiementMode(pme);
					}
					
					saveOnServer();
				}
			});
			ft.setWidget(row, 0, cb);
			ft.setWidget(row, 1, new Image(PNResources.PaiementModeImageResource.getPaiementModeImageResource(pme)));
			ft.setText(row, 2, pme.getDisplayName());
			
			
			textAreaCondition.setText(conditionTxt);
			textAreaCondition.addBlurHandler(new BlurHandler() {
				
				@Override
				public void onBlur(BlurEvent event) {
					if(cb.getValue()){
						store.getPaiementModes().updatePaiementModeCondition(pme, textAreaCondition.getText());
						saveOnServer();
					}
				}
			});
			ft.setWidget(row, 3, textAreaCondition);
			row++;
		}

		mainPanel.setMembers(lab, new WidgetCanvas(ft));

		return mainPanel;
	}


	private void saveOnServer() {
		RPCCallSequencer callSequencer = new RPCCallSequencer(
				"Enregistrement en cours...");
		final SaveStoreCallback saveStoreCallback = new SaveStoreCallback(store);
		callSequencer.addCall(saveStoreCallback);
		callSequencer.addRunnable(new Runnable() {
			public void run() {
			}
		});
		callSequencer.callSequence();
	}


}
